package main

import (
	"fmt"
	"math/rand"
	"time"
)

/**
切片用法
	a[start:end:max]
	start:下标起点
	end:终点，不包含这个下标 下标< end下标
	max:切片的长度,就是定义的切片的长度，可以用len函数获取
	长度计算：end-start
	容量计算：max-start
 */

 //初始化切片
func initData(s []int)  {
	rand.Seed(time.Now().UnixNano())
	for i := 0; i < len(s); i++ {
		s[i] = rand.Intn(100)
	}
}

//冒泡法排序复习
func order(s []int)  {
	for i := 0; i < len(s) -1; i++ {
		for j := 0; j < len(s) - 1 - i; j++ {
			if s[j] > s[j + 1]{
				s[j], s[j + 1] = s[j + 1], s[j]
			}
		}
	}
}

func main()  {
	//定义切片
	a := []int{1, 2, 3, 0, 0, 6, 7, 8}
	//取值,这里要写就写a的len()值，不写也行，但是不能乱写
	s := a[0:3]
	fmt.Println("s =", s)
	//长度
	fmt.Println("len s =", len(s))
	//容量
	fmt.Println("cap s =", cap(s))

	//取全部的值
	all := a[:]
	fmt.Println("all =", all)
	//长度
	fmt.Println("len all =", len(all))
	//容量
	fmt.Println("cap all =", cap(all))

	s = a[1:4:len(a)]
	fmt.Println("s =", s)
	//长度
	fmt.Println("len s =", len(s))
	//容量
	fmt.Println("cap s =", cap(s))

	//使用make函数创建切片
	//用法make(切片类型， 长度， 容量)，容量可以不指定，那就是和长度一样
	b := make([]int, 5)
	fmt.Println("b =", b)
	//长度
	fmt.Println("len b =", len(b))
	//容量
	fmt.Println("cap b =", cap(b))

	//使用append函数往切片末尾追加元素,append在超出切片容量的时候，他的容量会以2倍方式扩容，这里原来是5，append之后变为10，再超过10就变为20
	b = append(b, 11)
	b = append(b, 22)
	b = append(b, 33)
	b = append(b, 44)
	b = append(b, 55)
	b = append(b, 66)
	fmt.Println("b =", b)
	//长度
	fmt.Println("len b =", len(b))
	//容量
	fmt.Println("cap b =", cap(b))

	//使用copy函数复制切片,使用方法copy(粘贴的切片， 复制的切片), 后边的覆盖前边的
	c := []int{1, 2, 3}
	d := []int{6, 6, 6}
	copy(c, d)
	fmt.Println("c =", c)
	fmt.Println("d =", d)

	//切片作为参数传递给函数使用，它传递的是地址，不是值
	e := make([]int, 5)
	initData(e)
	fmt.Println("排序前e =", e)
	order(e)
	fmt.Println("排序后e =", e)
}
